home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
init.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-18
|
25KB
|
1,200 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
#include "doslib.h"
extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER]; /* ED */
extern COMMAND_UNIT command_table00[MAX_COMMAND_NUMBER]; /* ME */
extern COMMAND_UNIT command_table10[MAX_COMMAND_NUMBER]; /* ED */
extern int LCN;
extern UBYTE argv0[MAXLINE];
extern UBYTE options[MAX_OPTION][MAXLINE];
extern WORD UNDER_FLAG;
extern int kigou_new_flag;
extern UWORD fep_xf_bind_table[MAX_XF];
/* 初期化 */
UBYTE tpbody[MAXLINE],apbody[MAXLINE],kpbody[MAXLINE];
void
init_parameters()
{
FILE *fp;
STR tp,ap,kp;
struct NAMECKBUF inf;
int oc = 0;
*apbody = *tpbody = *kpbody = EOS;
while(*options[oc]) {
NAMECK(&options[oc][1],&inf);
if (!strcmp(etc_jstrup(inf.ext),".CNF")) {
strcpy(tpbody,&options[oc][1]); /* CONFIG FILE があった */
} else if (!strcmp(etc_jstrup(inf.ext),".ASK")) {
strcpy(apbody,&options[oc][1]); /* XF キーバインド FILE があった */
} else if (!strcmp(etc_jstrup(inf.ext),".KEY")) {
strcpy(kpbody,&options[oc][1]); /* コマンドキーバインド FILE があった */
} else if (!strcmp(etc_jstrup(&options[oc][1]),"RAW")) {
RAW_FLAG = 1; /* 生(属性を無視)である */
} else if (!strcmp(etc_jstrup(&options[oc][1]),"DUM")) {
DUM_FLAG = 1; /* ダミー(内部で変換しない)である */
}
oc++;
}
if (!*tpbody && ((tp = (STR)getenv("TWPATH")) || (tp = (STR)getenv("twpath")))) { /* 環境指定があった */
strcpy(tpbody,tp);
strcat(tpbody,"TW.CNF");
}
if (!*apbody && ((ap = (STR)getenv("TWPATH")) || (ap = (STR)getenv("twpath")))) { /* 環境指定があった */
strcpy(apbody,ap);
strcat(apbody,"TW.ASK");
}
if (!*kpbody && ((kp = (STR)getenv("TWPATH")) || (kp = (STR)getenv("twpath")))) { /* 環境指定があった */
strcpy(kpbody,kp);
strcat(kpbody,"TW.KEY");
}
init_try_ap(); /* 生指定か、TWPATH から得た物を試す */
if (!*apbody) { /* さもなきゃ、TW.X のあった所 */
NAMECK(argv0,&inf);
strncpy(apbody,inf.drive,2);
apbody[2] = EOS;
strcat(apbody,inf.path); /* パスを得る */
strcat(apbody,"TW.ASK");
init_try_ap(); /* 生指定か、TWPATH から得た物を試す */
}
fep_mode_set(FP_MODE);
init_try_kp(); /* 生指定か、TWPATH から得た物を試す */
if (!*kpbody) { /* さもなきゃ、TW.X のあった所 */
NAMECK(argv0,&inf);
strncpy(kpbody,inf.drive,2);
kpbody[2] = EOS;
strcat(kpbody,inf.path); /* パスを得る */
strcat(kpbody,"TW.KEY");
init_try_kp(); /* 生指定か、TWPATH から得た物を試す */
}
init_try_tp(); /* 生指定か、TWPATH から得た物を試す */
if (!*tpbody) { /* さもなきゃ、TW.X のあった所 */
NAMECK(argv0,&inf);
strncpy(tpbody,inf.drive,2);
tpbody[2] = EOS;
strcat(tpbody,inf.path); /* パスを得る */
strcat(tpbody,"TW.CNF");
init_try_tp(); /* 生指定か、TWPATH から得た物を試す */
}
if (!*tpbody) { /* CNF ファイルがない */
CURRENT_JIZUME=90;
CURRENT_CHANGED=0;
LYW_UPPER = LYW_UNDER = 0;/* LWIDTH=0 */
PAGE = 0;
CR_VIEW = 1; /* 改行を表示するか *//* CR=1 */
TAB_LENGTH_1 = (TAB_LENGTH = 8) -1;/* TAB=8,0 */
TAB_VIEW = 0;
CURRENT_BAK = 1; /* ~.BAK を作るのか? *//* BAK=1 */
ctrl_t_ed(); /* ED モード */
}
init_set_default();
}
/* apbody, tpbody, kpbody を読み込み、設定しようとする */
void
init_try_tp()
{
FILE *fp;
int raw_buff;
raw_buff = RAW_FLAG;
RAW_FLAG = 0;
if (fp = fopen((char *)tpbody,"rb")) { /* CNF ファイルがあった */
if (init_by_cnf_tn(fp,NULL,1,CURRENT_TEXT)) { /* ちゃんとした CNF ファイルであった */
fclose(fp);
} else {
if (!RAW_FLAG) {
error("コンフィグファイルが異常です");
}
}
} else {
*tpbody = EOS;
}
RAW_FLAG = raw_buff;
}
void
init_try_ap()
{
FILE *fp;
init_xf_bind_table();
if (fp = fopen((char *)apbody,"rb")) { /* ASK ファイルがあった */
init_by_env(fp);
fclose(fp);
} else {
*apbody = EOS;
}
}
void
init_try_kp()
{
FILE *fp;
if (fp = fopen((char *)kpbody,"rb")) { /* KEY ファイルがあった */
init_key_bind(fp);
fclose(fp);
} else {
*kpbody = EOS;
}
}
void
init_set_default()
{
DEFAULT_DATA.JIZUME = CURRENT_JIZUME;
DEFAULT_DATA.BAK_FLAG = CURRENT_BAK;
}
/* tn をデフォルトにする */
void
init_get_default_tn(int tn)
{
TDATA[tn].JIZUME = DEFAULT_DATA.JIZUME;
TDATA[tn].BAK_FLAG = DEFAULT_DATA.BAK_FLAG;
}
int
init_by_cnf_or_default_tn(FILE *fp,STR d,int tn)
{
if (!init_by_cnf_tn(fp,d,0,tn)) {
init_get_default_tn(tn);
}
}
STR INIT_PARAMETERS[] = {
"WIDTH","LWIDTH",
"PAGE",
"CR","TAB",
"BAK",
"MODE",
""
};
STR PRN_INIT_PARAMETERS[] = {
"TYPE",
"PIN","MSBUP",
"HDOT","VDOT",
"HGAP","VGAP",
"LEFT_MARGIN","UP_MARGIN",
"CRLF","FF","GIN","INIT","RESET",
""
};
void
init_by_cnf_sub_tn(STR s,int tn)
{
STR p;
if (p = strchr(s,':')) {
*p = EOS; /* ':' の後ろは注釈 */
}
if (p = strchr(s,'[')) {
STR p0;
if (p0 = strchr(s,']')) {
if (!init_by_cnf_sub0(p+1,tn) && !init_by_cnf_sub00(p+1,tn)) {
/* 失敗した */
error("コンフィグレーションに失敗しました");
return;
}
} else { /* 閉じてない! */
error("コンフィグレーションで対応すべき']'がありません");
return;
}
init_by_cnf_sub_tn(p0+1,tn); /* 再帰する */
}
}
/* 成功したかどうかを返す */
int
init_by_cnf_sub0(STR s,int tn)
{
int i;
STR p;
i = 0;
while(1) {
if (*INIT_PARAMETERS[i]) {
p = strstr(s,INIT_PARAMETERS[i]);
if (p == s) { /* 一致した */
p += strlen(INIT_PARAMETERS[i])+1;
break;
}
i++;
} else {
return(0);
}
}
switch(i) {
int ww;
int LYW_UPPER_w,LYW_UNDER_w;
case 0: /* WIDTH */
TDATA[tn].JIZUME = max(16,min(atoi(p),90));
break;
case 1: /* LWIDTH */
if (ctrl_t_lyw_work_check()) { /* 2つ以上のウインドウがある */
break;
}
ww = atoi(p);
LYW_UPPER_w = (ww & 1) ? LYW_UPPER0:0;
LYW_UNDER_w = (ww & 2) ? LYW_UNDER0:0;
if ((LYW_UPPER_w != LYW_UPPER) || (LYW_UNDER_w != LYW_UNDER)) {
ctrl_t_lyw_work(LYW_UPPER_w,LYW_MAIN0,LYW_UNDER_w);
}
break;
case 2: /* PAGE */
PAGE = atoi(p);
break;
case 3: /* CR */
if (ctrl_t_lyw_work_check()) { /* 2つ以上のウインドウがある */
break;
}
CR_VIEW = atoi(p);
disp_cr_mode();
ctrl_l();
break;
case 4: /* TAB */
if (ctrl_t_lyw_work_check()) { /* 2つ以上のウインドウがある */
break;
}
{
int w0,w1; /* おおう、scanf は int へのポインタでないといけない */
int vflag;
w0 = atoi(p);
if (p = strchr(p,',')+1) {
w1 = atoi(p);
}
w1 = (!!w1);
vflag = (TAB_VIEW != w1);
TAB_VIEW = w1;
if (TAB_LENGTH != w0) {
if (CL) { /* テキストの実体がある */
if (!disp_tab_change(w0)) { /* 変えなかった */
if (vflag) {
ctrl_l();
}
}
} else { /* テキストの実体がない */
etc_set_tab(w0);
}
} else if (vflag) {
ctrl_l();
}
}
break;
case 5: /* BAK */
TDATA[tn].BAK_FLAG = atoi(p);
break;
case 6: /* MODE */
etc_jstrup(p);
if ((p[0] == 'E') && (p[1] == 'D')) {
ctrl_t_ed0();
} else if ((p[0] == 'M') && (p[1] == 'E')) {
ctrl_t_me0();
}
break;
default: /* ??? */
return(0);
}
return(1);
}
/* 成功したかどうかを返す */
int
init_by_cnf_sub00(STR s,int tn)
{
int i;
STR p;
i = 0;
while(1) {
if (*PRN_INIT_PARAMETERS[i]) {
p = strstr(s,PRN_INIT_PARAMETERS[i]);
if (p == s) { /* 一致した */
p += strlen(PRN_INIT_PARAMETERS[i])+1;
break;
}
i++;
} else {
return(0);
}
}
if (!(sysflag & 0b1)) { /* 無視すべき */
return(1);
}
/*
window0();
printf("((%d))",i);binkey();
*/
switch(i) {
/*"TYPE","PIN","MSBUP","HDOT","VDOT",*/
/*"HGAP","VGAP","LEFT_MARGIN","UP_MARGIN",*/ /* この4つだけ */
/*"CRLF","FF","GIN","INIT","RESET",*/
case 5: /* HGAP */
PRN_H_PITCH = atoi(p);
break;
case 6: /* VGAP */
PRN_V_PITCH = min(atoi(p),50);
break;
case 7: /* LEFT_MARGIN */
PRN_LEFT_MARGIN = atoi(p);
break;
case 8: /* UP_MARGIN */
PRN_UP_MARGIN = atoi(p);
break;
default: /* ??? */
return(0);
}
return(1);
}
/* コンフィグファイルに従ってパラメータを設定する */
/* コンフィグでなかった場合は、最初の一行を d に返す */
/* 文書の先頭でも使う(flag = 0) */
int
init_by_cnf_tn(FILE *fp,STR d,int flag,int tn)
{
UBYTE s[MAXLINE],w[MAXLINE];
if (RAW_FLAG) {
return(0);
}
fgets((char *)s,MAXLINE,fp);
if (strcmp(s,"[This is a ThunderWord Text]\x0d\x0a")) {
if (d) {
strcpy(d,s);
}
return(0);
}
while(!feof(fp)) {
fgets((char *)s,MAXLINE,fp);
if (strcmp(s,"[ThunderWord Control End]\x0d\x0a")) { /* まだ終わりではない */
init_by_cnf_sub_tn(s,tn);
} else {
break;
}
}
if (flag) { /* モロにコンフィグファイルである */
/* プリンタ関係のパラメータが続く */
while(!feof(fp)) {
fgets((char *)s,MAXLINE,fp);
if (!strcmp(s,"(This is ThunderWord Printer Information)\x0d\x0a")) {
while(!feof(fp)) {
fgets((char *)s,MAXLINE,fp);
if (strcmp(s,"(ThunderWord Printer Information End)\x0d\x0a")) {
init_by_cnf_prn(s);
} else {
break;
}
}
}
}
}
return(1);
}
void
init_by_cnf_prn(STR s)
{
STR p;
if (p = strchr(s,':')) {
*p = EOS; /* ':' の後ろは注釈 */
}
if (p = strchr(s,'(')) {
STR p0;
if (p0 = strchr(s,')')) {
if (!init_by_cnf_prn0(p+1)) { /* 失敗した */
error("プリンタの設定に失敗しました");
return;
}
} else { /* 閉じてない! */
error("プリンタの設定で対応すべき')'がありません");
return;
}
init_by_cnf_prn(p0+1); /* 再帰する */
}
}
/* 成功したかどうかを返す */
int
init_by_cnf_prn0(STR s)
{
int i;
STR p;
i = 0;
while(1) {
if (*PRN_INIT_PARAMETERS[i]) {
p = strstr(s,PRN_INIT_PARAMETERS[i]);
if (p == s) { /* 一致した */
p += strlen(PRN_INIT_PARAMETERS[i])+1;
break;
}
i++;
} else {
return(0);
}
}
switch(i) {
case 0: /* TYPE */
PRN_TYPE = atoi(p);
prnt_set_type(); /* デフォルトを設定する */
break;
case 1: /* PIN */
PRN_PIN = atoi(p);
break;
case 2: /* MSBUP */
PRN_MSB_IS_UP = atoi(p);
break;
case 3: /* HDOT */
PRN_HDOT = atoi(p);
break;
case 4: /* VDOT */
PRN_VDOT = atoi(p);
break;
case 5: /* HGAP */
PRN_H_PITCH = atoi(p);
break;
case 6: /* VGAP */
PRN_V_PITCH = min(atoi(p),50);
break;
case 7: /* LEFT_MARGIN */
PRN_LEFT_MARGIN = atoi(p);
break;
case 8: /* UP_MARGIN */
PRN_UP_MARGIN = atoi(p);
break;
case 9: /* CRLF */
init_by_cnf_prn_hex0(PRN_CRLF,p);
break;
case 10: /* FF */
init_by_cnf_prn_hex0(PRN_FF,p);
break;
case 11: /* GIN */
init_by_cnf_prn_hex_gin(PRN_GIN,p);
break;
case 12: /* INIT */
init_by_cnf_prn_hex0(PRN_INIT,p);
break;
case 13: /* RESET */
init_by_cnf_prn_hex0(PRN_RESET,p);
break;
default: /* ??? */
return(0);
}
return(1);
}
void
init_by_cnf_prn_hex_gin(STR d,STR p)
{
init_by_cnf_prn_hex0(d,p);
if (p = strchr(p,'%')) {
d += strlen(d) + 1; /* EOS を越える */
/* %?d, %?m, %?i */
*d++ = *(++p) - '0';
*d++ = *(++p);
*d = EOS;
} else {
error("プリンタのグラフィック印字命令の設定が異常です");
}
}
/* 単純転送 */
void
init_by_cnf_prn_hex0(STR d,STR p)
{
UBYTE c,c0;
*d = EOS;
while(p) {
if (*p++ != '$') {
break;
} else {
if (!isxdigit(c = (*p++))) {
break;
}
if ((c0 = toupper(c)-'0') > 9) {
c0 -= 'A'-'0'-10;
}
if (!isxdigit(c = (*p++))) {
break;
}
if ((c = toupper(c)-'0') > 9) {
c -= 'A'-'0'-10;
/* c -= 'A'-'0'+10;*/
}
*d++ = ((c0 << 4) + c);
}
}
*d = EOS;
}
/* 文書の先頭で、コンフィグ部分をスキップする。最初の一行を d に返す */
int
init_skip_cnf(FILE *fp,STR d)
{
UBYTE s[MAXLINE];
fgets((char *)s,MAXLINE,fp); /* 最初の1行を読み出す */
if (!strcmp(s,"[This is a ThunderWord Text]\x0d\x0a")) { /* 毎度あり */
if (d) {
*d = EOS;
}
while(1) {
fgets((char *)s,MAXLINE,fp);
if (!strcmp(s,"[ThunderWord Control End]\x0d\x0a")) {
break;
}
}
return(1);
} else {
if (d) {
strcpy(d,s);
}
return(0);
}
}
/* 最初に一度だけ呼ばれる */
void
init_first()
{
register int i;
B_PRINT("\x1b[>5l");
LINE_SHORT = 0;
/* allmem();*/
CL = NIL;
ctrl_t_lyw_work0(LYW_UPPER,LYW_MAIN0,LYW_UNDER);
FREE_LINE_COUNTER = 0; /* フリーリストの行数は0 */
FREE_HEAD = FREE_TAIL = NIL; /* フリーリストの初期化 */
for(i=0;i<MAX_TEXT;i++) { /* テキストポインタを無効化しておく */
TDATA[i].TEXT_HEADS.MAE = TDATA[i].TEXT_TAILS.ATO = NIL;
TDATA[i].TEXT_HEADS.ATO = &TDATA[i].TEXT_TAILS;
TDATA[i].TEXT_TAILS.MAE = &TDATA[i].TEXT_HEADS;
TDATA[i].TEXT_FILE = -1;
line_store(&TDATA[i].TEXT_HEADS,(STR)"");
line_store(&TDATA[i].TEXT_TAILS,(STR)"");
TDATA[i].JIZUME = 64; /* 字詰めを設定 */
TDATA[i].TAB_SIZE = 8; /* タブ数を設定 */
TDATA[i].CHANGED_FLAG = 0; /* 変更されたかどうかのフラグ */
}
for(i=0;i<MAX_FILE;i++) { /* ファイルポインタを無効化しておく */
FILE_POINTERS[i] = NULL_FP;
*(FILE_NAMES[i].CONTENT) = EOS;
*(FILE_NAMES_ST[i].CONTENT) = EOS;
}
for(i=0;i<MAX_WINDOW;i++) { /* ウインドウと TEXT への対応を無効化しておく */
window_set_size(i,-1,-1,-1,-1);
window_set_position(i,0,0,0); /* カーソル位置の設定 */
window_set_text(i,-1);
}
window_set_text(0,0); /* 0番ウインドウを0番テキストに割り当てる */
window_set_size(0,0,0,XWIDTH-1,YWIDTH-3); /* 0番をフルサイズに */
init_screen();
window_set_position(0,0,0,0);
window_set_current(0); /* カレントを0番ウインドウにする */
/* HEAD = TAIL = HEAD = NIL;*/
BAG_LENGTH = 0; /* 袋の初期化 */
BAG_HEAD = BAG_TAIL = NIL; /* bag の頭、尻尾へのポインタを無効化 */
line_empty_bag((STR) NIL); /* 袋の初期化 */
CUT_BUFF_HEAD = CUT_BUFF_TAIL = NIL; /* カットバッファの頭、尻尾へのポインタ */
CUT_BUFF_HEAD0 = CUT_BUFF_TAIL0 = NIL;
/* 整行されたカットバッファの頭、尻尾へのポインタ */
ARG = 0; /* アーギュメントを無効にする */
etc_set_tab(8);
STRING_ESC1[0] = STRING_ESC2[0] = EOS;
RAW = 9;
/* RAW = RAW0;*/
CFUSI = CFUSI0;
OFUSI = OFUSI0;
KAKUTEI = KAKUTEI0;
NORMAL = NORMAL0;
/* CLICK_MODE = 0;*/
etc_color(NORMAL);
etc_func_on0();
LCN = -1; /* 無効化する */
kigou_begin = 0x8140; /* 記号入力の最初 */
code_input_mode = 0; /* コード入力は JIS */
kigou_or_code = 0;
touroku_hinshi = 17; /* やっぱ名詞が多いでしょ */
#if 0
CMDMOD = 1;
ctrl_t_cmd(); /* ひっくり返す */
#endif
LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
ed_big_scall = 0;
UNDER_FLAG = 0;
for(i=0;i<96*(8+16+4)+64;i++) {
PAT0[i] = 0;
}
RAW_FLAG = 0;
kigou_new_flag = 0;
MACRO_DEF_FLAG = MACRO_EXE_FLAG = MACRO_COUNT = 0;
MACRO_SEQUENCE[MACRO_COUNT] = 0;
PRN_WAIT = 5;
PRN_TATE_MODE = 1;
PRN_JIZUME = 0;
for(i=0;i<MAX_COMMAND_NUMBER;i++) {
command_table0[i] = command_table00[i];
command_table1[i] = command_table10[i];
}
DUM_FLAG = 0;
}
/* 画面の初期化 */
void
init_screen()
{
int i,t;
init_clear_screen();
for(i=0;i<YWIDTH;i++) {
SCREEN[i] = NIL;
} /* 全画面クリア */
for(i=0;i<MAX_WINDOW;i++) {
if ((t = WDATA[i].WTEXTS) >= 0) {
disp_btm_line(i);
SCREEN[WDATA[i].WY0] = &TDATA[t].TEXT_TAILS; /* !!! */
SCREEN[WDATA[i].WY1+1] = NOT; /* -1 */
}
}
disp_cursor_on();
}
/* 画面の初期化 */
void
init_current_screen()
{
int i,i0,t,x;
for(i0 = 0,i = CWY0;i <= CWY1;i++,i0++) {
SCREEN[i] = NIL;
window_loc(0,i0);
etc_bit_convert_and_disp(0,i,"");
}
t = WDATA[CWN].WTEXTS;
disp_btm_line(CWN);
SCREEN[WDATA[CWN].WY0] = &TDATA[t].TEXT_TAILS; /* !!! */
SCREEN[WDATA[CWN].WY1+1] = NOT; /* -1 */
}
void
init_clear_screen()
{
B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-2);
B_PRINT("\x1a"); /* 画面クリア */
}
UBYTE XF_TABLE[][24] = {
"BEGIN=CTRL+XF1", /* 変換モードに入る */
"END=CTRL+XF1", /* 無変換モードに入る */
"XFER=XF3", /* 変換を開始する */
"ENTER=XF5", /* 全文節を確定する */
"TYPE=F10", /* */
"DEL=DEL", /* */
"RIGHT=RIGHT", /* */
"LEFT=LEFT", /* */
"HOME=HOME", /* */
"CLR=CLR", /* キャンセル */
"CODE=F7", /* (SHIFT)JIS <-> 句点入力切り替え */
"LEARN=F9", /* 辞書学習モード */
"DIC=F8", /* 辞書の変更 */
"HIRAKATA=XF4", /* ひらがなカタカナ変換 */
"ZENHAN=SHIFT+XF4", /* 全角半角変換 */
"NEXTKOUHO1=XF3", /* 次候補1 */
"NEXTKOUHO2=XF3", /* 次候補2 */
"NEXTKOUHO3=XF3", /* 次候補3 */
"BACKKOUHO1=SHIFT+XF3", /* 前候補1 */
"BACKKOUHO2=SHIFT+XF3", /* 前候補2 */
"BACKKOUHO3=SHIFT+XF3", /* 前候補3 */
"NEXTBLOCK=DOWN", /* 次選択群 */
"BACKBLOCK=UP", /* 前選択群 */
"SHORTER=SHIFT+XF1", /* 文節を短くする */
"LONGER=SHIFT+XF2", /* 文節を長くする */
"NEXTBUN=XF2", /* 次文節へ */
"BACKBUN=XF1", /* 前文節へ */
"ECHO=F6", /* */
"DEFECHO=0", /* */
"DEFROME=1", /* 起動時はローマ字 */
"DEFKANA=0", /* 起動時はかな入力 */
"DEFZEN=1", /* 起動時は全角モード */
"DEFHIRA=1", /* 起動時はひらがな/カタカナ */
"DEFINS=0", /* */
"DEFALL=1", /* */
"DEFMEM=1", /* 起動時はメモリ/ディスク学習 */
"DEFCONT=0", /* */
""
};
void
init_xf_bind_table()
{
register int i;
for(i=0;i<MAX_XF;i++) {
fep_xf_bind_table[i] = i;
/* fep_key_bind_table[i] = i;*/
}
SP_XFER = 0;
}
void
init_by_env(FILE *fp)
{
UBYTE s[MAXLINE];
register int i;
while(!feof(fp)) {
fgets((char *)s,MAXLINE,fp);
if (strchr(s,'=')) {
init_by_env_sub(s);
}
}
if (fep_xf_bind_table[32] == 0x103) {
SP_XFER = 1;
}
/*
window0();
printf("(%d)",fep_xf_bind_table[32]);
printf("(%d)",fep_xf_bind_table[0x103]);binkey();
*/
}
void
init_by_env_sub(STR s)
{
UBYTE w[MAXLINE],w0[MAXLINE];
STR p,p0;
register int i;
if (p = strchr(s,':')) {
*p = EOS; /* ':' の後ろは注釈 */
}
if (p = etc_get_left(s,'=',w)) { /* w が左 p が右 */
for(i=0;*XF_TABLE[i];i++) {
int v,v0;
p0 = etc_get_left(XF_TABLE[i],'=',w0);
if (strcmp(w,w0)) {
continue;
}
/* 一致する物が見つかった */
v = init_by_env_val(w);
if ((*p == '0') || (*p == '1')) {
/* フラグパートだ */
if (v < 0) {
v0 = *p - '0';
switch(v) {
case -1: /* DEFROME:起動時はローマ字 */
FP_MODE[2] = "-R"[v0];
break;
case -2: /* DEFKANA:起動時はかな入力 */
FP_MODE[1] = "-K"[v0];
break;
case -3: /* DEFZEN:起動時は全角モード */
FP_MODE[0] = "HZ"[v0];
break;
case -4: /* DEFHIRA:起動時はひらがな/カタカナ */
FP_MODE[4] = "-H"[v0];
/* LEDMOD(5,v0);*/
break;
case -5: /* DEFMEM:起動時はメモリ/ディスク学習 */
v0 = !v0;
/*
window0();
printf("(%d)[[%d]]",KNJCTRL(12),v0);binkey();
*/
if (KNJCTRL(12) != v0) { /* 学習モードをチェック */
KNJCTRL(11,v0);
}
break;
}
}
} else {
/* p が押されたら p0 を返す様にする */
/*
cls();
printf("{%s}:(%s)-[%s]\n",s,p,p0);binkey();
*/
if (v >= 0) {
v = init_by_env_val(p);
v0 = init_by_env_val(p0);
if (v0 < MAX_XF) {
fep_xf_bind_table[v] = v0;
}
}
}
break;
}
}
}
typedef struct VAL_UNIT {
UBYTE name[10];
WORD val;
} VAL_UNIT;
VAL_UNIT VAL_LIST[] = {
{"SP",32},
{"HOME",FEP_HOME_CODE},
{"DEL",FEP_DEL_CODE},
{"ROLLUP",FEP_ROLLUP_CODE},{"ROLLDOWN",FEP_ROLLDN_CODE},
{"LEFT",FEP_LEFTARROW_CODE},{"RIGHT",FEP_RIGHTARROW_CODE},
{"UP",FEP_UPARROW_CODE},{"DOWN",FEP_DNARROW_CODE},
{"CLR",0x1f},
{"XF1",0x101},{"XF2",0x102},{"XF3",0x103},{"XF4",0x104},{"XF5",0x105},
{"F1",0x201},{"F2",0x202},{"F3",0x203},{"F4",0x204},{"F5",0x205},
{"F6",0x206},{"F7",0x207},{"F8",0x208},{"F9",0x209},{"F10",0x20a},
{"SHIFT",0x10},{"CTRL",0x20},
{"NULL",0},
{"DEFROME",-1}, /* 起動時はローマ字 */
{"DEFKANA",-2}, /* 起動時はかな入力 */
{"DEFZEN",-3}, /* 起動時は全角モード */
{"DEFHIRA",-4}, /* 起動時はひらがな/カタカナ */
{"DEFMEM",-5}, /* 起動時はメモリ/ディスク学習 */
{"",0}
};
int
init_by_env_val(STR p)
{
register int i;
STR s;
while(etc_last(p) < ' ') {
if (i = strlen(p)) {
p[i-1] = EOS; /* 後ろのコントロールコードを削る */
} else {
break;
}
}
if (s = strchr(p,'+')) { /* ?? + ?? である */
*s++ = EOS;
if ((i = init_by_env_val0(p)) == 0x20) { /* ctrl だ */
i = init_by_env_val0(s);
if (('A' <= i) && (i <= 'Z')) {
return(i-'@');
}
return(i + 0x20);
} else {
return(i + init_by_env_val0(s));
}
} else {
return(init_by_env_val0(p));
}
}
int
init_by_env_val0(STR p)
{
register int i;
STR s;
if (strlen(p) == 1) { /* 長さが1のトークンなら */
return(toupper(*p));
/* return(*p - '@' - 0x20);*/
}
i = 0;
while(*(s = VAL_LIST[i].name)) {
if (!strcmp(s,p)) {
return(VAL_LIST[i].val);
}
i++;
}
return(0);
}
/* s 中の '=' の左を ks に、右を kd に入れて返す */
void
init_key_bind_sub(STR s,UWORD ks[],UWORD kd[])
{
register STR p;
p = strstr(s,"<<");
*p++ = EOS;
*p++ = EOS;
init_key_bind_sub0(s,ks);
init_key_bind_sub0(p,kd);
etc_kb_change(ks,kd);
/*
printf("{%d}",etc_kb_change(ks,kd));
{
int i;
for(i=0;ks[i];i++) {
printf("[%2x]",ks[i]);
}
printf("<<");
for(i=0;kd[i];i++) {
printf("[%2x]",kd[i]);
}
printf(" \n");
}
binkey();
*/
}
/* s 中のつじつまの合うキーストロークを ks の中に返す */
void
init_key_bind_sub0(STR s,UWORD ks[])
{
register int i;
register UBYTE c;
UBYTE d[MAXLINE];
for(i=0;c = s[i];i++) { /* 最初のスペースかタブか全角スペースを捨てる */
if ((c == ' ') || (c == TAB)) {
continue;
}
if (((c << 8) | s[i+1]) == L' ') {
i++;
continue;
}
break;
}
s += i;
for(i=0;c = s[i];i++) { /* 最初のスペースかタブか改行か全角スペースで切る */
if ((c == ' ') || (c == TAB) || (c == CR) || (c == 'M'-'@')
|| (((c << 8) | s[i+1]) == L' ')) {
s[i] = EOS;
break;
}
}
while(1) {
s += init_key_bind_sub00(s,d);
if (*d) { /* 何か返ってきた */
if (*d == '^') {
if (c = d[1]) { /* コントロールコードだ */
*ks++ = c - '@';
} else { /* 単体の ^ だ */
*ks++ = '^';
}
} else if (!strcmp(d,"<NL>")) {
*ks++ = 'M' - '@';
} else if (!strcmp(d,"ESC")) {
*ks++ = '[' - '@';
} else if (!strcmp(d,"<SP>")) {
*ks++ = ' ';
} else if (!strcmp(d,"HELP")) {
*ks++ = FEP_HELP_CODE;
} else if (!strcmp(d,"INS")) {
*ks++ = FEP_INS_CODE;
} else if (!strcmp(d,"DEL")) {
*ks++ = FEP_DEL_CODE;
} else if (!strcmp(d,"HOME")) {
*ks++ = FEP_HOME_CODE;
} else if (!strcmp(d,"CLR")) {
*ks++ = FEP_CLR_CODE;
} else if (!strcmp(d,"UNDO")) {
*ks++ = FEP_UNDO_CODE;
} else {
*ks++ = *d;
}
} else {
break;
}
}
*ks = 0x0000;
}
/* トークンを切り出す */
/* すすむべきインデックスを返す */
int
init_key_bind_sub00(STR s,STR d)
{
UBYTE *p;
strcpy(d,s);
if (p = strchr(d,'-')) {
if (p == d) { /* 先頭が '-' だ */
if (p = strchr(p+1,'-')) {
*p = EOS;
return(strlen(d)+1);
} else {
return(strlen(d));
}
} else {
*p = EOS;
return(strlen(d)+1);
}
} else {
return(strlen(d));
}
}
/* 与えられたファイルポインタにもとづいてキーバインドを書き換える */
/* CMDMOD を参照する */
void
init_key_bind(FILE *fp)
{
UWORD ks[MAXLINE],kd[MAXLINE];
UBYTE s[MAXLINE];
register int i;
while(!feof(fp)) {
fgets((char *)s,MAXLINE,fp);
if (strstr(s,"<<")) {
init_key_bind_sub(s,ks,kd);
}
}
if (CMDMOD) { /* ed である */
ctrl_t_ed0();
} else { /* me である */
ctrl_t_me0();
}
}
UINT LED_MODE_OUT;
UINT LED_MODE;
/* 終了する時などに呼び出す */
void
init_exit()
{
UINT w;
disp_cursor_on();
fep_init_exit();
/* fep_ledset(first_led);*/
under_blanc();
etc_func_on0();
fcloseall();
etc_color(NORMAL);
B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-2);
B_LOCATE(0,YWIDTH0-2);
w = 0;
if (LED_MODE & 0x400) {
w |= 0x4;
}
if (LED_MODE & 0x200) {
w |= 0x2;
}
if (LED_MODE & 0x20) {
w |= 0x1;
}
KNJCTRL(1,1);
KNJCTRL(5,w);
KNJCTRL(1,0);
init_omajinai();
}
/* 終了する時などに呼び出す */
void
init_omajinai()
{
UINT w;
register int i,m,mask;
m = LED_MODE_OUT >> 4;
for(mask=1,i=0;i<=6;i++,mask<<=1) {
if (m & mask) {
LEDMOD(i,0);
KNJCTRL(53);
LEDMOD(i,1);
KNJCTRL(53);
} else {
LEDMOD(i,1);
KNJCTRL(53);
LEDMOD(i,0);
KNJCTRL(53);
}
}
}